package com.t.bricks.bussiness.service.paylog.impl;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.t.bricks.bussiness.db.dao.common.CommonDao;
import com.t.bricks.bussiness.db.entity.paylog.PayLog;
import com.t.bricks.bussiness.service.paylog.PayLogService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.function.data.MoneyUtil;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 支付流水'PayLog表'基本业务操作类接口实现
 * @author HuangXinBian
 * @DateTime 2022年09月09日 17:41:07
 */
@Service
public class PayLogServiceImpl implements PayLogService<PayLog> {

	@Autowired
	private CommonDao commonDao;

	/**
	 * 新增
	 * @param payLog 支付流水 对象实体,注意:跨包访问时可能会是json字符串
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity add(Object payLog) {
		MsgEmity me = ModuleUtil.objToEntity(payLog, PayLog.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		PayLog payLogData = me.getData();
		payLogData.setdPay(new Date());//支付时间
		payLogData.setiErrorCount(0);//错误次数
		
		me = ModuleUtil.validDbEntityByAdd(payLogData);// 通用的基本数据验证,如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		if (MoneyUtil.isNegative(payLogData.getmMoney())) {
			return MsgEmity.err(8001, "支付金额不能是负数");
		}
		
		if (payLogData.getiTally().intValue() < 0) {
			return MsgEmity.err(8002, "支付积分不能是负数");
		}
		
		if (payLogData.getiTally().intValue() == 0 && MoneyUtil.isZero(payLogData.getmMoney())) {
			return MsgEmity.err(8003, "支付金额与支付积分不能都是0");
		}
		
		String userId = ModuleUtil.currentLoginUserId();
		if (!userId.equals(payLogData.getsCustomerId())) {
			return MsgEmity.err(8004, "顾客编号不符");
		}
		
		me = this.hasByKey("sOrdersId", payLogData.getsOrdersId());
		if (!me.isSuccess() && !me.getData().equals(0)) {
			return me.appendDataCode(100);
		}
		
		if (me.isSuccess()) {
			return MsgEmity.err(8005, "已经存在支付订单");
		}
		
		me = this.callMapping("hasOrders", payLogData.getsOrdersId(), payLogData.getsCustomerId());
		if (!me.isSuccess()) {
			return me;
		}
		
		if (me.getData().equals(0)) {
			return MsgEmity.err(8006, "订单不存在,不能进行支付");
		}

		me = this.callMapping("getOrdersState", payLogData.getsOrdersId());
		if (!me.isSuccess()) {
			return me;
		}
		
		if (!me.getData().equals(1)) {
			return MsgEmity.err(8007, "订单状态已不是待支付状态,禁止支付");
		}
				
		payLogData.setuId(payLogData.getsOrdersId());//设置记录编号
		
		me = ModuleUtil.supplyDbEntityAttrByAdd(payLogData, payLogData.getsOrdersId(), null);// 补充数据,如添加id、当前用户、当前时间等
		if (!me.isSuccess()) {
			return me;
		}
		
		return commonDao.add(payLogData);
	}
	
}
